/*
** FUNCIONES PFS 
*/
#include "StPfs.h"
#include <time.h>
#include <sys/time.h>

#define MAXINTENTOS 255 
#define MAXPATHLEN 255

//****************************************
/*char *itoa(long num){
char *aux;
if ((aux=malloc(sizeof(long)))==NULL) {
	return NULL;
}
sprintf(aux,"%d",num);
return aux;
}
*/

/* devuelve el value del keyword buscado en el archivo values_file*/
int read_config_var( char *values_file, char *keyword , char value[] )
{
	static char str[80];
	int len;
	FILE * _file;

	if( keyword == NULL ) return (-1);

	len = strlen(keyword);

	if( len > 77) return(-2);


	if( values_file )
	{
		_file = fopen(values_file, "r");
		if (_file == NULL) return(-1);
	}
	else
		return(-2);

	if( fseek(_file, 0, SEEK_SET) )
	{
		fclose(_file);
		return(-1);
	}

	for(;;)
	{
		fgets(str, 80, _file);
		if( ferror(_file) || feof(_file) ) return(-2);
		len = strlen(str);

		if( strncmp(keyword, str, strlen(keyword)) == 0 )
		{

				if (str[len - 1] == '\n') str[--len] = 0;
				if (str[len - 1] == '\r') str[--len] = 0;
				sprintf(value, "%s", &str[strlen(keyword)+1] ); break;

		}
	}

	fclose(_file);

return 0;
}


//*************************************************
char* generarId(char *str) {
//*************************************************

       int  i, stime;
       long ltime;
      
       /* Obtenemos la fecha Actual */

       ltime = time(NULL);
       stime = (unsigned) ltime/2;
       srand(stime);
       
       sprintf(str,"%015d",rand());
     //printf("el id que va a llevar el mensaje es >><>%s\n",str); 
       return str;
    }

//***************************************************************************
void armaheaderipc(tipo_header_ipc *header, char type , long paylength ){
//***************************************************************************
        //printf("entro a la funcion que arma el header\n"); 
		//printf("salio del if\n");
		header->type = type;
		header->payloadlength = paylength;
     }
//*******************************************************
int sendall(int s, char * buf , int *len){
//*******************************************************

   int total = 0; 			// cantidad de bytes que se han enviado
   int bytesleft = *len ; 	// bytes que quedan por enviar
   int n;
   int intentos;
   
   intentos = 0;

   while( total < *len ){

   	n = send (s, buf+total, bytesleft, 0 );
      if ( n == -1 ){
      	break;
         perror("send:");
      }

      total += n;

      bytesleft -= n;

      intentos = intentos + 1;

      //printf("Enviando restantes: %d enviados: %d intentos: %d \n", bytesleft, total, intentos);

      if ( intentos > MAXINTENTOS ){
      	*len = 0;
         return( -1 );
      }
   }

   *len = total;			// regresa el valor que tiene la cantidad realmente enviada

	return n==-1?-1:0;	// regresa -1 si falla o 0 si fue exitoso

}
//**************************************************************
int recvall(int s, char * buf , int *len){
//**************************************************************
   int total = 0; 			// cantidad de bytes que se desean recibir
   int bytesleft = *len ; 	// bytes que quedan por recibir
   int n;
   int intentos;
   
   intentos = 0;

   while( total < *len ){
	
   	n = recv(s, buf+total, bytesleft, 0);
	//printf("el n es:%d\n",n);
      	
      if ( n==-1 ||n==0){
      //printf("en el if");
     	n=-1;
      	break;
         perror("send:");
      }
	//printf("paso el if");
      total += n;

      bytesleft -= n;

      intentos = intentos + 1;

      //printf("Recibiendo restantes: %d recibidos: %d intentos: %d \n", bytesleft, total, intentos);

      if ( intentos > MAXINTENTOS ){
      	*len = 0;
         return( -1 );
    	}

   }

   *len = total;			// regresa el valor que tiene la cantidad realmente recibida
	//printf("antes de return");
	return n== -1 ?-1:0;	// regresa -1 si falla o 0 si fue exitoso

}
//************************************************************************
int calculolectura(long sector,int cabezal,long cilindro,long sectores,long *poscabezal){
//************************************************************************
double tiempocilindro=5.5;
double tiemposector=1;
int secrecorridos;
long cantmovcab;
long cilinicio;
long cilbus;
double tiempototal=0;

cilinicio=*poscabezal/sectores;
cilinicio++;

if (sector>=*poscabezal) {
	cilbus=(sector)/sectores;//valor entero***
	cilbus++;
	tiempototal=tiempototal+(cilbus-cilinicio)*tiempocilindro;
	tiempototal=tiempototal+(sector-((cilbus-cilinicio)*sectores+*poscabezal))*tiemposector;
	printf("el tiempo de busqueda fue de %f milisegundos\n",tiempototal);
	}//del if
*poscabezal=sector;

return (0);
}

int write_log(char *msg, char *nombre, FILE *logfile, int mostrar, int tipo)
{
        char* szStrtok;
        char cabecera[20];
        time_t tval;
        struct tm *now;

        tval = time(NULL);
        now  = localtime(&tval);

        if (mostrar == 1)
        {
        	szStrtok = strtok(msg,":");
        	strcpy(cabecera,szStrtok);
        	szStrtok = strtok(NULL,"\0\r\n"); 
			if (tipo == 1) /* Informacion */

/*            			printf("\e[30;42m%s:\e[0m%s\n",cabecera,szStrtok); */
				printf("\e[32m%s:%s\e[0m\n",cabecera,szStrtok);		
			else if (tipo == 0) /* Error */
/*            			printf("\e[30;41m%s:\e[0m%s\n",cabecera,szStrtok); */

				printf("\e[31m%s:%s\e[0m\n",cabecera,szStrtok);
			else /* Warning */
/*          			printf("\e[37;44m%s:\e[0m%s\n",cabecera,szStrtok); */
				printf("\e[1;33m%s:%s\e[0m\n",cabecera,szStrtok);

			fprintf(logfile, "[%02d/%02d/%d %d:%02d:%02d] [%s] [%d] %s:%s\n",
			now->tm_mday, now->tm_mon+1, now->tm_year+1900, now->tm_hour, now->tm_min, now->tm_sec, nombre, getpid(), cabecera, szStrtok);
        }
		else
			fprintf(logfile, "[%02d/%02d/%d %d:%02d:%02d] [%s] [%d] %s\n",
			now->tm_mday, now->tm_mon+1, now->tm_year+1900, now->tm_hour, now->tm_min, now->tm_sec, nombre, getpid(), msg);

        fflush(logfile);
	return 1;
}


//************************************************************************
//
//FUNCIONES DE FAT
//************************************************************************
/*
void getfat_12 ( unsigned char *pfat )
{
    int *fatentry ;
    int i, k ;

    for ( k = 2 ; k < 18 ; k++ )
    {
        i = k * 3 / 2 ;

        fatentry =  ( int* ) ( pfat + i ) ;

        if ( ( k % 2 ) == 0 )
            value = ( *fatentry & 0x0fff ) ;
        elsevalue = ( *fatentry >> 4 ) ;

        printf ( "%03x   ", value ) ;
        if ( k % 9 == 0 )
            printf ( "\n" ) ;
    }
}

void read_fat_info ( long fat_num )
{
    int j, i ;

    unsigned char *p ;

    if ( strncmp ( "FAT12", filetypestr, 5 ) == 0 )
    {
        p = ( unsigned char* ) malloc ( bs.bps ) ;
        absread ( 0, 1, fat_num, p ) ;
        getfat_12( p ) ;
    }

    if ( strncmp ( "FAT16", filetypestr, 5 ) == 0 )
    {
        shortint *pfat ;
        p = ( unsigned char* ) malloc ( bs.bps ) ;
        absread ( 2, 1, fat_num, p ) ;
        pfat = ( shortint* ) p ;

        for ( j = 0 ; j < 2 ; j++ )
        {
            printf ( "\n%d   ", j * 8 ) ;
            for ( i = 0 ; i < 8 ; i++ )
            {
                printf ( "%04x  ", *pfat++ ) ;
            }
        }
    }
}

void fat_info( )
{
    longint first_fat, second_fat ;

    first_fat = bs.reservedsec ;
    second_fat = bs.reservedsec + bs.secperfat ;

    printf ( "\n%s Fat Information", filetypestr ) ;
    printf ( "\n-------------------------------" ) ;

    printf ( "\nFirst FAT Information\n" ) ;

    read_fat_info ( first_fat ) ;

    printf ( "\n\nSecond FAT Information\n" ) ;

    read_fat_info ( second_fat ) ;
    printf ( "\n-------------------------------\n" ) ;
}
*/
//************************************************************************

